package com.example.shoputils.id;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @Author 刘武贵
 * @Date 2024/2/26 23:57
 * @Description 功能描述：定义加载params.properties文件的工具类
 * 为了便于管理每个服务的dataCenterId和machineId，这里将每个服务的dataCenterId和machineId作为配置参数，
 * 后续也可以存储到Zookeeper或者Etcd等分布式配置中心。
 *
 * 所以，在新建SnowFlakeLoader类，SnowFlakeLoader类的作用主要是加载classpath类路径下的snowflake/snowflake.properties文件，读取dataCenterId和machineId，
 */
public class SnowFlakeLoader {

    /**
     * 数据中心ID常量
     */
    public static final String DATA_CENTER_ID = "data.center.id";

    /**
     * 机器ID常量
     */
    public static final String MACHINE_ID = "machine.id";

    /**
     * 静态属性，用于存储配置信息
     */
    private volatile static Properties instance;
    static {
        // 从类路径下加载配置文件
        InputStream in = SnowFlakeLoader.class.getClassLoader().getResourceAsStream("snowflake/snowflake.properties");
        instance = new Properties();
        try {
            instance.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据键获取配置文件中的字符串值
     */
    private static String getStringValue(String key){
        if(instance == null) {
            return "";
        }
        return instance.getProperty(key, "");
    }

    /**
     * 根据键获取配置文件中的长整型值
     */
    private static Long getLongValue(String key){
        // 根据键获取配置文件中的字符串值
        String v = getStringValue(key);
        return (v == null || v.trim().isEmpty()) ? 0 : Long.parseLong(v);
    }

    /**
     * 获取数据中心ID
     */
    public static Long getDataCenterId() {
        // 根据键获取配置文件中的长整型值
        return getLongValue(DATA_CENTER_ID);
    }

    /**
     * 获取机器ID
     */
    public static Long getMachineId() {
        return getLongValue(MACHINE_ID);
    }

    public static void main(String[] args) throws InterruptedException {
        System.out.println(getDataCenterId());
        System.out.println(getMachineId());
        System.out.println(Long.MAX_VALUE);
        System.out.println(SnowFlakeFactory.getSnowFlakeByDataCenterIdAndMachineIdFromCache(SnowFlakeLoader.getDataCenterId(), SnowFlakeLoader.getMachineId()).nextId());
        System.out.println(SnowFlakeFactory.getSnowFlakeFromCache().nextId());
    }
}
